#include "../include/kasm.h"
#include "kernel/driver/screen.h"
#include "kernel/system/idt.h"
#include "kernel/system/multitasker.h"
#include "kernel/system/filesystem.h"
#include "kernel/driver/keyboard.h"
#include "kernel/system/keyboardlisteners.h"
#include "kernel/system/cache.h"

#include "kernel/system/klib/printk.h"

#include "std/systemcall.h"
#include "std/errno.h"

#include "user/shell.h"
#include "user/user.h"

//codigo de unix v7, para revisar: http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7

void init_paging();

void _Cli();
void _Sti();


/*proceso idle o ciclo inactivo del sistema.*/
int idle(int argc,char* argv[]){
	setpriority(0);
	while(1);
}

/**********************************************
kmain()
Punto de entrada de codigo C.
*************************************************/

kmain()
{
	/*Limpia la pantalla*/
	printk("\x1B[2J");
	
	init_gdt();

	/*Inicializa todo lo que hace falta inicializar*/
	printk("initializing descriptor table\n");
	init_descriptor_tables();
	
	
	init_exceptions();
	
	printk("initializing int 80h\n");
	init_int80();
	
	printk("initializing in out streams\n");
	init_in_out();

	printk("initializing keyboard driver\n");
	init_keyboard();
	init_screen();

	printk("initializing timer tick\n");
	init_timer_tick();
	

	printk("initializing paging\n");
	init_paging();
	
	printk("initializing mulititasking system\n");
	init_multitasker();
	
	printk("initializing cache\n");
	init_cache();
	/*ahora si habilita interupciones*/
	_Sti();
	
	
	
			
	init_filesystem();
	
	
	init_errno();
		
	User root;
	getUserRoot(&root);
	changeCurrentUser(&root);
	
	loadFileSystem();
	
	initUsersFile();
	
	/*crea un proceso que se va a encargar de inicializar las shells,
	los parametros que le pasa son valores dummy.*/

	char* argv[1];
	argv[0]=NULL;
	
	setname("init",0);
	setname("idle",fork(idle,argv));
	
	
	
	setname("cache flusher",fork(cache_flusher,argv));
	
	printk("opening shell\n");
	setname("shells init",fork(shells_init,argv));
	
	
	/*proceso init, que consume los zombies huerfanos.*/
	int stat;
	while(1){
		__waitpid(-1,&stat);
	};
}
